0942. 增减字符串匹配【简单】
1. 📝 题目描述
由范围 [0,n] 内所有整数组成的 n + 1 个整数的排列序列可以表示为长度为 n 的字符串 s,其中:
- 如果
perm[i] < perm[i + 1],那么s[i] == 'I' - 如果
perm[i] > perm[i + 1],那么s[i] == 'D'
给定一个字符串 s,重构排列 perm 并返回它。如果有多个有效排列 perm,则返回其中任何一个。
示例 1:
txt
输入:s = "IDID"
输出:[0,4,1,3,2]1
2
2
示例 2:
txt
输入:s = "III"
输出:[0,1,2,3]1
2
2
示例 3:
txt
输入:s = "DDI"
输出:[3,2,0,1]1
2
2
提示:
1 <= s.length <= 10^5s只包含字符"I"或"D"
2. 🎯 s.1 - 双指针(low/high 贪心)
js
/**
* @param {string} s
* @return {number[]}
*/
var diStringMatch = function (s) {
const n = s.length
let low = 0
let high = n
const res = new Array(n + 1)
for (let i = 0; i < n; i++) {
if (s[i] === 'I') {
res[i] = low
low++
} else {
res[i] = high
high--
}
}
res[n] = low // 此时 low === high
return res
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 时间复杂度:
,单次遍历字符串 - 空间复杂度:
,除返回结果外仅用常数变量
算法思路:
- 维护两个边界:
low=0与high=n - 贪心思想:每一步做出局部最优选择,这种选择方式确保了后续一定有解,不会陷入死胡同
- 遇到
'I'Increase ↑ 取当前最小值(保证之后可以放更大的)并令low++ - 遇到
'D'Decrease ↓ 取当前最大值(保证之后可以放更小的)并令high--
- 遇到
- 遍历结束时
low==high,将最后一个位置赋为该值 - 该策略保证相邻关系满足增减要求,且一次构造完成